package com.daniel.juc.pool;

import java.util.concurrent.*;

/**
 * new ThreadPoolExecutor.AbortPolicy() // 银行满了，还有人进来，不处理这个人的，抛出异常
 * new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里！
 * new ThreadPoolExecutor.DiscardPolicy() //队列满了，丢掉任务，不会抛出异常！
 * new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了，尝试去和最早的竞争，也不会抛出异常！
 * <p>
 * 最大线程到底该如何定义
 * 1、CPU 密集型，几核，就是几，可以保持CPu的效率最高！
 * 2、IO  密集型   > 判断你程序中十分耗IO的线程
 * 如15个大型任务那么可以开2倍的线程进行处理
 *
 * @author Daniel
 * @version V1.0
 * @date 2020/5/21 10:30
 */
public class Demo02 {

	public static void main(String[] args) {

		// 获取cpu的核数
		System.out.println("获取cpu的核数：" + Runtime.getRuntime().availableProcessors());
		// 自定义线程池！工作 ThreadPoolExecutor
		ExecutorService pool = new ThreadPoolExecutor(
				// 核心线程池大小
				2,
				// 最大核心线程池大小
				Runtime.getRuntime().availableProcessors(),
				// 超时没人调用就会释放，超时时间
				3,
				// 超时单位
				TimeUnit.SECONDS,
				// 阻塞队列
				new LinkedBlockingDeque<>(3),
				// 线程工厂
				Executors.defaultThreadFactory(),
				new ThreadPoolExecutor.DiscardOldestPolicy());

		try {
			// 最大承载：Deque+max（阻塞队列数+最大核心线程池大小）
			for (int i = 1; i <= 9; i++) {
				// 使用了线程池之后，使用线程池来创建线程
				pool.execute(() -> {
					System.out.println(Thread.currentThread().getName() + " ok");
				});
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 线程池用完，程序结束，关闭线程池
			pool.shutdown();
		}
	}
}
